package com.rolerealm.controller;

import com.rolerealm.common.result.Result;
import com.rolerealm.common.util.ResultUtil;
import com.rolerealm.domain.dto.SkillDTOs.SkillExecuteRequest;
import com.rolerealm.domain.dto.SkillDTOs.SkillExecuteResponse;
import com.rolerealm.domain.vo.SkillVO;
import com.rolerealm.service.SkillService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 技能控制器
 * 
 * @author RoleRealm Team
 * @version 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/api/skills")
@RequiredArgsConstructor
public class SkillController {

    private final SkillService skillService;

    /**
     * 获取所有技能列表
     * 
     * @return 技能列表
     */
    @GetMapping
    public Result<List<SkillVO>> getAllSkills() {
        log.debug("获取所有技能列表");
        
        List<SkillVO> skills = skillService.getAllSkills();
        return ResultUtil.success(skills);
    }

    /**
     * 根据技能类型获取技能列表
     * 
     * @param skillType 技能类型
     * @return 技能列表
     */
    @GetMapping("/type/{skillType}")
    public Result<List<SkillVO>> getSkillsByType(@PathVariable String skillType) {
        log.debug("根据技能类型获取技能列表，技能类型：{}", skillType);
        
        List<SkillVO> skills = skillService.getSkillsByType(skillType);
        return ResultUtil.success(skills);
    }

    /**
     * 根据技能代码获取技能详情
     * 
     * @param skillCode 技能代码
     * @return 技能详情
     */
    @GetMapping("/{skillCode}")
    public Result<SkillVO> getSkillByCode(@PathVariable String skillCode) {
        log.debug("根据技能代码获取技能详情，技能代码：{}", skillCode);
        
        SkillVO skill = skillService.getSkillByCode(skillCode);
        return ResultUtil.success(skill);
    }

    /**
     * 获取启用的技能列表
     * 
     * @return 技能列表
     */
    @GetMapping("/enabled")
    public Result<List<SkillVO>> getEnabledSkills() {
        log.debug("获取启用的技能列表");
        
        List<SkillVO> skills = skillService.getEnabledSkills();
        return ResultUtil.success(skills);
    }

    /**
     * 根据标签获取技能列表
     * 
     * @param tag 标签
     * @return 技能列表
     */
    @GetMapping("/tag/{tag}")
    public Result<List<SkillVO>> getSkillsByTag(@PathVariable String tag) {
        log.debug("根据标签获取技能列表，标签：{}", tag);
        
        List<SkillVO> skills = skillService.getSkillsByTag(tag);
        return ResultUtil.success(skills);
    }

    /**
     * 技能直连执行
     */
    @PostMapping("/{skillType}:execute")
    public Result<SkillExecuteResponse> execute(@PathVariable String skillType,
                                                @RequestBody @Valid SkillExecuteRequest request) {
        log.debug("技能执行，类型：{}，请求：{}", skillType, request);
        SkillExecuteResponse resp = skillService.execute(skillType, request);
        return ResultUtil.success(resp);
    }
}
